//==--- DiagnosticCommentKinds.td - diagnostics related to comments -------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

let Component = "Comment" in {
let CategoryName = "Documentation Issue" in {

// HTML parsing errors.  These are under -Wdocumentation to make sure the user
// knows that we didn't parse something as they might expect.

def warn_doc_html_start_tag_expected_quoted_string : Warning<
  "expected quoted string after equals sign">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_html_start_tag_expected_ident_or_greater : Warning<
  "HTML start tag prematurely ended, expected attribute name or '>'">,
  InGroup<Documentation>, DefaultIgnore;

def note_doc_html_tag_started_here : Note<
  "HTML tag started here">;

// HTML semantic errors

def warn_doc_html_end_forbidden : Warning<
  "HTML end tag '%0' is forbidden">,
  InGroup<DocumentationHTML>, DefaultIgnore;

def warn_doc_html_end_unbalanced : Warning<
  "HTML end tag does not match any start tag">,
  InGroup<DocumentationHTML>, DefaultIgnore;

def warn_doc_html_start_end_mismatch : Warning<
  "HTML start tag '%0' closed by '%1'">,
  InGroup<DocumentationHTML>, DefaultIgnore;

def note_doc_html_end_tag : Note<
  "end tag">;

def warn_doc_html_missing_end_tag : Warning<
  "HTML tag '%0' requires an end tag">,
  InGroup<DocumentationHTML>, DefaultIgnore;

// Commands

def warn_doc_block_command_empty_paragraph : Warning<
  "empty paragraph passed to '%select{\\|@}0%1' command">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_block_command_duplicate : Warning<
  "duplicated command '%select{\\|@}0%1'">,
  InGroup<Documentation>, DefaultIgnore;

def note_doc_block_command_previous : Note<
  "previous command '%select{\\|@}0%1' here">;

def note_doc_block_command_previous_alias : Note<
  "previous command '%select{\\|@}0%1' (an alias of '\\%2') here">;

// \param command

def warn_doc_param_invalid_direction : Warning<
  "unrecognized parameter passing direction, "
  "valid directions are '[in]', '[out]' and '[in,out]'">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_param_spaces_in_direction : Warning<
  "whitespace is not allowed in parameter passing direction">,
  InGroup<DocumentationPedantic>, DefaultIgnore;

def warn_doc_param_not_attached_to_a_function_decl : Warning<
  "'%select{\\|@}0param' command used in a comment that is not attached to "
  "a function declaration">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_function_method_decl_mismatch : Warning<
  "'%select{\\|@}0%select{function|functiongroup|method|methodgroup|callback}1' "
  "command should be used in a comment attached to "
  "%select{a function|a function|an Objective-C method|an Objective-C method|"
  "a pointer to function}2 declaration">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_api_container_decl_mismatch : Warning<
  "'%select{\\|@}0%select{class|interface|protocol|struct|union}1' "
  "command should not be used in a comment attached to a "
  "non-%select{class|interface|protocol|struct|union}2 declaration">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_container_decl_mismatch : Warning<
  "'%select{\\|@}0%select{classdesign|coclass|dependency|helper"
  "|helperclass|helps|instancesize|ownership|performance|security|superclass}1' "
  "command should not be used in a comment attached to a non-container declaration">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_param_duplicate : Warning<
  "parameter '%0' is already documented">,
  InGroup<Documentation>, DefaultIgnore;

def note_doc_param_previous : Note<
  "previous documentation">;

def warn_doc_param_not_found : Warning<
  "parameter '%0' not found in the function declaration">,
  InGroup<Documentation>, DefaultIgnore;

def note_doc_param_name_suggestion : Note<
  "did you mean '%0'?">;

// tparam command

def warn_doc_tparam_not_attached_to_a_template_decl : Warning<
  "'%select{\\|@}0tparam' command used in a comment that is not attached to "
  "a template declaration">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_tparam_duplicate : Warning<
  "template parameter '%0' is already documented">,
  InGroup<Documentation>, DefaultIgnore;

def note_doc_tparam_previous : Note<
  "previous documentation">;

def warn_doc_tparam_not_found : Warning<
  "template parameter '%0' not found in the template declaration">,
  InGroup<Documentation>, DefaultIgnore;

def note_doc_tparam_name_suggestion : Note<
  "did you mean '%0'?">;

// \returns command

def warn_doc_returns_not_attached_to_a_function_decl : Warning<
  "'%select{\\|@}0%1' command used in a comment that is not attached to "
  "a function or method declaration">,
  InGroup<Documentation>, DefaultIgnore;

def warn_doc_returns_attached_to_a_void_function : Warning<
  "'%select{\\|@}0%1' command used in a comment that is attached to a "
  "%select{function returning void|constructor|destructor|"
  "method returning void}2">,
  InGroup<Documentation>, DefaultIgnore;

// \deprecated command

def warn_doc_deprecated_not_sync : Warning<
  "declaration is marked with '%select{\\|@}0deprecated' command but does "
  "not have a deprecation attribute">,
  InGroup<DocumentationDeprecatedSync>, DefaultIgnore;

def note_add_deprecation_attr : Note<
  "add a deprecation attribute to the declaration to silence this warning">;

// inline contents commands

def warn_doc_inline_command_not_enough_arguments : Warning<
  "'%select{\\|@}0%1' command has %plural{0:no|:%2}2 word argument%s2, expected %3">,
  InGroup<Documentation>, DefaultIgnore;

// verbatim block commands

def warn_verbatim_block_end_without_start : Warning<
  "'%select{\\|@}0%1' command does not terminate a verbatim text block">,
  InGroup<Documentation>, DefaultIgnore;

def warn_unknown_comment_command_name : Warning<
  "unknown command tag name">,
  InGroup<DocumentationUnknownCommand>, DefaultIgnore;

def warn_correct_comment_command_name : Warning<
  "unknown command tag name '%0'; did you mean '%1'?">,
  InGroup<DocumentationUnknownCommand>, DefaultIgnore;

} // end of documentation issue category
} // end of AST component
